#-*- coding: UTF-8 -*-
from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember
from pyramid.security import forget

from sqlalchemy.orm import eagerload


from scp.modelo.models import DBSession
from scp.modelo.Tipo_Item import Tipo_Item
from scp.modelo.Rol import Rol
from scp.modelo.Permiso import Permiso
from scp.modelo.Item import Item
from scp.modelo.Fase import Fase
from scp.modelo.ValoresCadena import ValoresCadena
from scp.modelo.ValoresNumerico import ValoresNumerico
from scp.modelo.RelacionA_S import RelacionA_S
from scp.modelo.RelacionP_H import RelacionP_H


from scp.modelo.ValoresFecha import ValoresFecha
from pyramid.response import Response
from pyramid.view import view_config
import json

import re

#@view_config(renderer='json')
def items(request):
	"""Método controlador encargado de la administración de los itmes.
		URL asociada: /items/{operacion}
		operacion:
			viewTipoItems: retorna tipos de items asocidos a la fase
			traerAtributos: retorna los atributos de un determinado tipo de item
		@param request: Petición Http del cliente. 	
	"""
	
	methodRequest = request.method
		
	dicParametros = request.matchdict
	

	if dicParametros.get('operacion') == 'crear' and request.url.find('?') == -1:
		print 'respondí un diccionario normal'
		return {'content':'Hello!'}	
	
	
	session = DBSession()
	if dicParametros.get('operacion') == 'viewTipoItems':
		#debemos enviar todos los tipos de items correspondientes a la fase.
		fase = session.query(Fase).filter_by(id = request.params['idFase']).first()
		#tiposItems = session.query(Tipo_Item).all()
		tiposItems = fase.tipos_items
		tiposItemsArray = []
		
		for tipoItem in tiposItems:
			aux = {'idTipoItem': tipoItem.id, 'nombreTipoItem': tipoItem.nombre} 
			tiposItemsArray.append(aux)
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, tiposItems = [{'idTipoItem':'1', 'nombreTipoItem': 'Caso de Uso'}, {'idTipoItem':'2', 'nombreTipoItem': 'Requerimiento Funcional'}]))
		responseView.body = json.dumps(dict(success = True, tiposItems = tiposItemsArray))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
	
	
	if dicParametros.get('operacion') == 'traerAtributos':
		#traemos los atributos del tipo de item solicitado
		tipoItem = session.query(Tipo_Item).filter_by(id=request.params['idTipoItem']).first()
		
		atributos = tipoItem.atributos
		atributosArray = []
		
		for atributo in atributos:
			aux = {'nombre':atributo.nombre, 'tipo': atributo.tipo_dato}
			atributosArray.append(aux)
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		responseView.body = json.dumps(dict(success = True, atributos = atributosArray))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
		
		
	if dicParametros.get('operacion') == 'traerItems':
		itemsFase = session.query(Item).filter_by(fase_id=request.params['idFase'], flagUltimo = 1, flagBorrado = 0).all()
		
		print ">>>cantidad de item que vamos a enviar desde el contralador"
		print len(itemsFase)
		
		itemsJson = []
		for item in itemsFase:
			aux = {'nombreItem': item.nombre, 'idItem':item.id, 'codItem': item.codigo, 'complejidadItem': item.complejidad, 
			'descripcionItem':item.descripcion , 'nombreTipoItem':item.tipoItem.nombre, 'versionItem':item.version, 'idTipoItem': item.tipoItem.id,
			'estadoItem':item.estado}	
			itemsJson.append(aux)
		
		
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseView.body = json.dumps(dict(success = True, items = itemsJson))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView	
		
		
	if dicParametros.get('operacion') == 'guardar':
		itemDic = json.loads(request.params['item'])
		
		print '>>>itemdic.get(data)'
		itemData = itemDic.get('data')
		print itemDic.get('data')
		
		nuevoItem = Item()
		
		#ahora vamos a calcular el codigo para el item
		nombreProyecto = request.params['nombreProyecto']
		nombreFase = request.params['nombreFase']
		
		#traemos el tipo de item
		tipoItem = session.query(Tipo_Item).filter_by(id = itemData.get('idTipoItem') ).first()
		nombreTipoItem = tipoItem.nombre
		itemsPorTipoItem = session.query(Item).filter_by(tipoItem_id = itemData.get('idTipoItem'), fase_id = request.params['idFase'] ).all()
		
		fase = request.params['idFase']
		tipo = itemData.get('idTipoItem')
		print '>>>request.params idFase]'
		print fase
		print 'request.params idTipoItem'
		print tipo
		
		print '>>>len(itemsPorTipoItem)'
		print len(itemsPorTipoItem)
		
		secuencia = len(itemsPorTipoItem) + 1
	
		nuevoItem.codigo = nombreProyecto[0:3] + '_' + nombreFase[0:3] + '_' + nombreTipoItem[0:3] + '_' + str(secuencia)
		nuevoItem.nombre = itemData.get('nombreItem')
		nuevoItem.complejidad = itemData.get('complejidadItem')
		nuevoItem.descripcion = itemData.get('descripcionItem')
		nuevoItem.version = 1
		nuevoItem.flagUltimo = 1
		nuevoItem.flagBorrado = 0
		nuevoItem.estado = 'ACTIVO'
		
		print '>>>esto es idItem'
		print itemData.get('idTipoItem')
		
		
		
		
		print '>>>esto es el nombre del tipo de item que se trajo de la BD'
		print tipoItem.nombre
		
		nuevoItem.tipoItem = tipoItem
		
		
		session.add( nuevoItem )
		
		#asignamos el item a la fase correspondiente
		fase = session.query(Fase).filter_by(id = request.params['idFase'] ).first()
		fase.items.append(nuevoItem)
		
		#guardamos los valores del Tipo de Item asociados al Item
		camposJson =  json.loads(request.params['camposEspecificos'])  
		print '>>>camposJson'
		print camposJson
		
		for campo in camposJson:
			
			print '>>>campoIndex'
			print campo
			
			tipoCampo = campo.get('tipo')
			
			print '>>>>>>>>>>>tipoCampo'
			print tipoCampo
			
			if tipoCampo == 'CADENA':
				valorCadenaAdd = ValoresCadena()
				valorCadenaAdd.valor = campo.get('valor')
				valorCadenaAdd.item_id = nuevoItem.id
				valorCadenaAdd.version_item = 1
				valorCadenaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorCadenaAdd)
			if tipoCampo == 'FECHA':
				valorFechaAdd = ValoresFecha()
				valorFechaAdd.valor = campo.get('valor')
				valorFechaAdd.item_id = nuevoItem.id
				valorFechaAdd.version_item = 1
				valorFechaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorFechaAdd)	
			if tipoCampo == 'NUMERICO':
				valorNumericoAdd = ValoresNumerico()
				valorNumericoAdd.valor = campo.get('valor')
				valorNumericoAdd.item_id = nuevoItem.id
				valorNumericoAdd.version_item = 1
				valorNumericoAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorNumericoAdd)
		
		session.add( nuevoItem )
		
		responseGuardar = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseGuardar.body = json.dumps(dict(success = True))
		responseGuardar.content_type = 'application/json'
		return responseGuardar	
	
	if dicParametros.get('operacion') == 'traerAtributosValor':
		#traemos los atributos del tipo de item solicitado
		print '>>>id tipo recibido'
		print request.params['idTipoItem']
		
		tipoItem = session.query(Tipo_Item).filter_by(id=request.params['idTipoItem']).first()
		
		atributos = tipoItem.atributos
		atributosArray = []
		
		for atributo in atributos:
			valor = None
			if atributo.tipo_dato == 'CADENA':
				registroValor = session.query(ValoresCadena).filter_by(item_id = request.params['idItem'], 
					nombreAtributo = atributo.nombre, version_item = request.params['versionItem']).first()
			if atributo.tipo_dato == 'FECHA':
				registroValor = session.query(ValoresFecha).filter_by(item_id = request.params['idItem'], 
					nombreAtributo = atributo.nombre, version_item = request.params['versionItem']).first()
			if atributo.tipo_dato == 'NUMERICO':
				registroValor = session.query(ValoresNumerico).filter_by(item_id = request.params['idItem'], 
					nombreAtributo = atributo.nombre, version_item = request.params['versionItem']).first()
			
			valor = registroValor.valor
			
			aux = {'nombre':atributo.nombre, 'tipo': atributo.tipo_dato, 'valor': valor}
			atributosArray.append(aux)
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		responseView.body = json.dumps(dict(success = True, atributos = atributosArray))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
		
	if dicParametros.get('operacion') == 'guardarEdicion':	
		itemDic = json.loads(request.params['item'])
		
		print '>>>itemdic.get(data)'
		itemData = itemDic.get('data')
		print itemDic.get('data')
		
		nuevoItem = Item()
		itemEditado = session.query(Item).filter_by(id=request.params['idItem']).first()
		itemEditado.flagUltimo = 0
		

		nombreProyecto = request.params['nombreProyecto']
		nombreFase = request.params['nombreFase']
		
		#traemos el tipo de item
		tipoItem = session.query(Tipo_Item).filter_by(id = itemData.get('idTipoItem') ).first()
		nombreTipoItem = tipoItem.nombre
	
	
		nuevoItem.codigo = itemEditado.codigo
		nuevoItem.nombre = itemEditado.nombre
		nuevoItem.complejidad = itemData.get('complejidadItem')
		nuevoItem.descripcion = itemData.get('descripcionItem')
		nuevoItem.version = itemEditado.version + 1
		nuevoItem.flagUltimo = 1
		nuevoItem.estado = 'ACTIVO'
		nuevoItem.flagBorrado = 0
		
		
		
		nuevoItem.tipoItem = tipoItem
		
		
		session.add( nuevoItem )
		
		#asignamos el item a la fase correspondiente
		fase = session.query(Fase).filter_by(id = request.params['idFase'] ).first()
		fase.items.append(nuevoItem)
		
		#guardamos los valores del Tipo de Item asociados al Item
		camposJson =  json.loads(request.params['camposEspecificos'])  
		print '>>>camposJson'
		print camposJson
		
		for campo in camposJson:
			
			print '>>>campoIndex'
			print campo
			
			tipoCampo = campo.get('tipo')
			
			if tipoCampo == 'CADENA':
				valorCadenaAdd = ValoresCadena()
				valorCadenaAdd.valor = campo.get('valor')
				valorCadenaAdd.item_id = nuevoItem.id
				valorCadenaAdd.version_item = nuevoItem.version
				valorCadenaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorCadenaAdd)
			if tipoCampo == 'FECHA':
				valorFechaAdd = ValoresFecha()
				valorFechaAdd.valor = campo.get('valor')
				valorFechaAdd.item_id = nuevoItem.id
				valorFechaAdd.version_item = nuevoItem.version
				valorFechaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorFechaAdd)	
			if tipoCampo == 'NUMERICO':
				valorNumericoAdd = ValoresNumerico()
				valorNumericoAdd.valor = campo.get('valor')
				valorNumericoAdd.item_id = nuevoItem.id
				valorNumericoAdd.version_item = nuevoItem.version
				valorNumericoAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorNumericoAdd)
		
	
		responseEdit = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		responseEdit.body = json.dumps(dict(success = True))
		responseEdit.content_type = 'application/json'

		return responseEdit
	if dicParametros.get('operacion') == 'eliminar':
		idItem = request.params['idItem']
		
		print ">>>id de item a eliminar"
		print idItem
		
		itemBorrar = session.query(Item).filter_by(id = idItem ).first()
		
		print ">>> nombre de item a borrar"
		print itemBorrar.nombre
		
		itemBorrar.flagBorrado = 1
		
		print '>>>itemBorrar.flagBorrado despues de setarlo'
		print itemBorrar.flagBorrado
		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
	
	if dicParametros.get('operacion') == 'confirmar':
		idItem = request.params['idItem']
	
		itemConfirmar = session.query(Item).filter_by(id = idItem ).first()
	
		itemConfirmar.estado = 'PENDIENTE_APROBACION'

		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
		
	if dicParametros.get('operacion') == 'aprobar':
		idItem = request.params['idItem']
	
		itemAprobado = session.query(Item).filter_by(id = idItem ).first()
	
		itemAprobado.estado = 'APROBADO'

		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
	
	if dicParametros.get('operacion') == 'rechazar':
		idItem = request.params['idItem']
	
		itemBorrar = session.query(Item).filter_by(id = idItem ).first()
	
		itemBorrar.estado = 'ACTIVO'

		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response		
	
	if dicParametros.get('operacion') == 'traerHistorialItem':
		itemsFase = session.query(Item).filter_by(fase_id=request.params['idFase'], flagUltimo = 0, flagBorrado = 0, codigo = request.params['codItem']).all()
		
		print ">>>cantidad de item que vamos a enviar desde el contralador"
		print len(itemsFase)
		
		
		itemsJson = []
		for item in itemsFase:
			aux = {'nombreItem': item.nombre, 'idItem':item.id, 'codItem': item.codigo, 'complejidadItem': item.complejidad, 
			'descripcionItem':item.descripcion , 'nombreTipoItem':item.tipoItem.nombre, 'versionItem':item.version, 'idTipoItem': item.tipoItem.id,
			'estadoItem':item.estado}	
			itemsJson.append(aux)
		
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseView.body = json.dumps(dict(success = True, items = itemsJson))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
		
	if dicParametros.get('operacion') == 'revertir':	
		itemVersion = session.query(Item).filter_by(id=request.params['idItemVersion']).first() 		
		itemUltimo = session.query(Item).filter_by(id=request.params['idItemUltimo']).first()

		#comenzamos la reversión
		nuevoItem = Item()

		nuevoItem.codigo = itemVersion.codigo
		nuevoItem.nombre = itemVersion.nombre
		nuevoItem.descripcion = itemVersion.descripcion
		nuevoItem.version = itemUltimo.version + 1
		nuevoItem.flagUltimo = 1
		nuevoItem.flagBorrado = 0
		nuevoItem.estado = itemVersion.estado
		nuevoItem.complejidad = itemVersion.complejidad
		nuevoItem.tipoItem = itemVersion.tipoItem

		#asignamos el item a la fase correspondiente
		fase = session.query(Fase).filter_by(id = itemUltimo.fase_id ).first()
		fase.items.append(nuevoItem)
		
		#guardamos el item
		session.add(nuevoItem)
		
		#hacemos que la ultima version ya no sea la ultima
		itemUltimo.flagUltimo = 0
		
		
		#setemos los valores de atributo
		atributosCadena = session.query(ValoresCadena).filter_by(item_id=itemVersion.id).all() 	
		atributosFecha = session.query(ValoresFecha).filter_by(item_id=itemVersion.id).all()
		atributosNumerico = session.query(ValoresNumerico).filter_by(item_id=itemVersion.id).all()

		#vamos reversionando los atributos
		print '>>>len(atributosCadena)'
		print len(atributosCadena)
		if len(atributosCadena) > 0: 
			nuevoAtributo = ValoresCadena()
			for atributo in atributosCadena:
				
				nuevoAtributo.nombreAtributo = atributo.nombreAtributo
				nuevoAtributo.valor = atributo.valor
				nuevoAtributo.item_id = nuevoItem.id
				nuevoAtributo.version_item = nuevoItem.version
			session.add(nuevoAtributo)
			
			print '>>>estos es lo que hay después de hacer add CADENA'
			
				
			print nuevoAtributo.nombreAtributo
			print nuevoAtributo.valor
			print nuevoAtributo.item_id
			print nuevoAtributo.version_item

		print '>>>len(atributosFecha)'
		print len(atributosFecha)
				
		if len(atributosFecha) > 0:
			nuevoAtributo = ValoresFecha()	
			for atributo in atributosFecha:
				
				nuevoAtributo.nombreAtributo = atributo.nombreAtributo
				nuevoAtributo.valor = atributo.valor
				nuevoAtributo.item_id = nuevoItem.id
				nuevoAtributo.version_item = nuevoItem.version
			session.add(nuevoAtributo)
			
			print '>>>estos es lo que hay después de hacer add FECHA'
			
				
			print nuevoAtributo.nombreAtributo
			print nuevoAtributo.valor
			print nuevoAtributo.item_id
			print nuevoAtributo.version_item
		
				
		print '>>>len(atributosNumerico)'
		print len(atributosNumerico)
		
		if len(atributosNumerico) > 0:		
			nuevoAtributo = ValoresNumerico()	
			for atributo in atributosNumerico:
				
				nuevoAtributo.nombreAtributo = atributo.nombreAtributo
				nuevoAtributo.valor = atributo.valor
				nuevoAtributo.item_id = nuevoItem.id
				nuevoAtributo.version_item = nuevoItem.version		
			session.add(nuevoAtributo)
			
			
			print '>>>estos es lo que hay después de hacer adD nuMERICO'
			
				
			print nuevoAtributo.nombreAtributo
			print nuevoAtributo.valor
			print nuevoAtributo.item_id
			print nuevoAtributo.version_item
			
		
		#retornamos
		response = Response()
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response		
		
		#guardamos los valores del Tipo de Item asociados al Item
		camposJson =  json.loads(request.params['camposEspecificos'])  
		print '>>>camposJson'
		print camposJson
		
		for campo in camposJson:
			
			print '>>>campoIndex'
			print campo
			
			tipoCampo = campo.get('tipo')
			
			if tipoCampo == 'CADENA':
				valorCadenaAdd = ValoresCadena()
				valorCadenaAdd.valor = campo.get('valor')
				valorCadenaAdd.item_id = nuevoItem.id
				valorCadenaAdd.version_item = 1
				valorCadenaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorCadenaAdd)
			if tipoCampo == 'FECHA':
				valorFechaAdd = ValoresFecha()
				valorFechaAdd.valor = campo.get('valor')
				valorFechaAdd.item_id = nuevoItem.id
				valorFechaAdd.version_item = 1
				valorFechaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorFechaAdd)	
			if tipoCampo == 'NUMERICO':
				valorNumericoAdd = ValoresNumerico()
				valorNumericoAdd.valor = campo.get('valor')
				valorNumericoAdd.item_id = nuevoItem.id
				valorNumericoAdd.version_item = 1
				valorNumericoAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorNumericoAdd)
			
		
		responseGuardar = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseGuardar.body = json.dumps(dict(success = True))
		responseGuardar.content_type = 'application/json'
		return responseGuardar	
	
	if dicParametros.get('operacion') == 'traerAtributosValor':
		#traemos los atributos del tipo de item solicitado
		print '>>>id tipo recibido'
		print request.params['idTipoItem']
		
		tipoItem = session.query(Tipo_Item).filter_by(id=request.params['idTipoItem']).first()
		
		atributos = tipoItem.atributos
		atributosArray = []
		
		for atributo in atributos:
			valor = None
			if atributo.tipo_dato == 'CADENA':
				registroValor = session.query(ValoresCadena).filter_by(item_id = request.params['idItem'], 
					nombreAtributo = atributo.nombre, version_item = request.params['versionItem']).first()
			if atributo.tipo_dato == 'FECHA':
				registroValor = session.query(ValoresFecha).filter_by(item_id = request.params['idItem'], 
					nombreAtributo = atributo.nombre, version_item = request.params['versionItem']).first()
			if atributo.tipo_dato == 'NUMERICO':
				registroValor = session.query(ValoresNumerico).filter_by(item_id = request.params['idItem'], 
					nombreAtributo = atributo.nombre, version_item = request.params['versionItem']).first()
			
			valor = registroValor.valor
			
			aux = {'nombre':atributo.nombre, 'tipo': atributo.tipo_dato, 'valor': valor}
			atributosArray.append(aux)
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		responseView.body = json.dumps(dict(success = True, atributos = atributosArray))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
		
	if dicParametros.get('operacion') == 'guardarEdicion':	
		itemDic = json.loads(request.params['item'])
		
		print '>>>itemdic.get(data)'
		itemData = itemDic.get('data')
		print itemDic.get('data')
		
		nuevoItem = Item()
		itemEditado = session.query(Item).filter_by(id=request.params['idItem']).first()
		itemEditado.flagUltimo = 0
		

		nombreProyecto = request.params['nombreProyecto']
		nombreFase = request.params['nombreFase']
		
		#traemos el tipo de item
		tipoItem = session.query(Tipo_Item).filter_by(id = itemData.get('idTipoItem') ).first()
		nombreTipoItem = tipoItem.nombre
	
	
		nuevoItem.codigo = itemEditado.codigo
		nuevoItem.nombre = itemEditado.nombre
		nuevoItem.complejidad = itemData.get('complejidadItem')
		nuevoItem.descripcion = itemData.get('descripcionItem')
		nuevoItem.version = itemEditado.version + 1
		nuevoItem.flagUltimo = 1
		nuevoItem.estado = 'ACTIVO'
		nuevoItem.flagBorrado = 0
		
		
		
		nuevoItem.tipoItem = tipoItem
		
		
		session.add( nuevoItem )
		
		#asignamos el item a la fase correspondiente
		fase = session.query(Fase).filter_by(id = request.params['idFase'] ).first()
		fase.items.append(nuevoItem)
		
		#guardamos los valores del Tipo de Item asociados al Item
		camposJson =  json.loads(request.params['camposEspecificos'])  
		print '>>>camposJson'
		print camposJson
		
		for campo in camposJson:
			
			print '>>>campoIndex'
			print campo
			
			tipoCampo = campo.get('tipo')
			
			if tipoCampo == 'CADENA':
				valorCadenaAdd = ValoresCadena()
				valorCadenaAdd.valor = campo.get('valor')
				valorCadenaAdd.item_id = nuevoItem.id
				valorCadenaAdd.version_item = nuevoItem.version
				valorCadenaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorCadenaAdd)
			if tipoCampo == 'FECHA':
				valorFechaAdd = ValoresFecha()
				valorFechaAdd.valor = campo.get('valor')
				valorFechaAdd.item_id = nuevoItem.id
				valorFechaAdd.version_item = nuevoItem.version
				valorFechaAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorFechaAdd)	
			if tipoCampo == 'NUMERICO':
				valorNumericoAdd = ValoresNumerico()
				valorNumericoAdd.valor = campo.get('valor')
				valorNumericoAdd.item_id = nuevoItem.id
				valorNumericoAdd.version_item = nuevoItem.version
				valorNumericoAdd.nombreAtributo = campo.get('nombreCampo')
				session.add(valorNumericoAdd)
		
	
		responseEdit = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		responseEdit.body = json.dumps(dict(success = True))
		responseEdit.content_type = 'application/json'

		return responseEdit
	if dicParametros.get('operacion') == 'eliminar':
		idItem = request.params['idItem']
		
		print ">>>id de item a eliminar"
		print idItem
		
		itemBorrar = session.query(Item).filter_by(id = idItem ).first()
		
		print ">>> nombre de item a borrar"
		print itemBorrar.nombre
		
		itemBorrar.flagBorrado = 1
		
		print '>>>itemBorrar.flagBorrado despues de setarlo'
		print itemBorrar.flagBorrado
		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
	
	if dicParametros.get('operacion') == 'confirmar':
		idItem = request.params['idItem']
	
		itemConfirmar = session.query(Item).filter_by(id = idItem ).first()
	
		itemConfirmar.estado = 'PENDIENTE_APROBACION'

		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
		
	if dicParametros.get('operacion') == 'aprobar':
		idItem = request.params['idItem']
	
		itemAprobado = session.query(Item).filter_by(id = idItem ).first()
	
		itemAprobado.estado = 'APROBADO'

		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
	
	if dicParametros.get('operacion') == 'rechazar':
		idItem = request.params['idItem']
	
		itemBorrar = session.query(Item).filter_by(id = idItem ).first()
	
		itemBorrar.estado = 'ACTIVO'

		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, atributos = [{'nombre':'Nombre', 'tipo': 'Cadena'}, {'nombre':'Fecha Inicio', 'tipo': 'Fecha'}]))
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response		
	
	if dicParametros.get('operacion') == 'traerHistorialItem':
		itemsFase = session.query(Item).filter_by(fase_id=request.params['idFase'], flagUltimo = 0, flagBorrado = 0, codigo = request.params['codItem']).all()
		
		print ">>>cantidad de item que vamos a enviar desde el contralador"
		print len(itemsFase)
		
		
		itemsJson = []
		for item in itemsFase:
			aux = {'nombreItem': item.nombre, 'idItem':item.id, 'codItem': item.codigo, 'complejidadItem': item.complejidad, 
			'descripcionItem':item.descripcion , 'nombreTipoItem':item.tipoItem.nombre, 'versionItem':item.version, 'idTipoItem': item.tipoItem.id,
			'estadoItem':item.estado}	
			itemsJson.append(aux)
		
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseView.body = json.dumps(dict(success = True, items = itemsJson))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView
		
	if dicParametros.get('operacion') == 'revertir':	
		itemVersion = session.query(Item).filter_by(id=request.params['idItemVersion']).first() 		
		itemUltimo = session.query(Item).filter_by(id=request.params['idItemUltimo']).first()

		#comenzamos la reversión
		nuevoItem = Item()

		nuevoItem.codigo = itemVersion.codigo
		nuevoItem.nombre = itemVersion.nombre
		nuevoItem.descripcion = itemVersion.descripcion
		nuevoItem.version = itemUltimo.version + 1
		nuevoItem.flagUltimo = 1
		nuevoItem.flagBorrado = 0
		nuevoItem.estado = itemVersion.estado
		nuevoItem.complejidad = itemVersion.complejidad
		nuevoItem.tipoItem = itemVersion.tipoItem

		#asignamos el item a la fase correspondiente
		fase = session.query(Fase).filter_by(id = itemUltimo.fase_id ).first()
		fase.items.append(nuevoItem)
		
		#guardamos el item
		session.add(nuevoItem)
		
		#hacemos que la ultima version ya no sea la ultima
		itemUltimo.flagUltimo = 0
		
		
		#setemos los valores de atributo
		atributosCadena = session.query(ValoresCadena).filter_by(item_id=itemVersion.id).all() 	
		atributosFecha = session.query(ValoresFecha).filter_by(item_id=itemVersion.id).all()
		atributosNumerico = session.query(ValoresNumerico).filter_by(item_id=itemVersion.id).all()

		#vamos reversionando los atributos
		print '>>>len(atributosCadena)'
		print len(atributosCadena)
		if len(atributosCadena) > 0: 
			nuevoAtributo = ValoresCadena()
			for atributo in atributosCadena:
				
				nuevoAtributo.nombreAtributo = atributo.nombreAtributo
				nuevoAtributo.valor = atributo.valor
				nuevoAtributo.item_id = nuevoItem.id
				nuevoAtributo.version_item = nuevoItem.version
			session.add(nuevoAtributo)
			
			print '>>>estos es lo que hay después de hacer add CADENA'
			
				
			print nuevoAtributo.nombreAtributo
			print nuevoAtributo.valor
			print nuevoAtributo.item_id
			print nuevoAtributo.version_item

		print '>>>len(atributosFecha)'
		print len(atributosFecha)
				
		if len(atributosFecha) > 0:
			nuevoAtributo = ValoresFecha()	
			for atributo in atributosFecha:
				
				nuevoAtributo.nombreAtributo = atributo.nombreAtributo
				nuevoAtributo.valor = atributo.valor
				nuevoAtributo.item_id = nuevoItem.id
				nuevoAtributo.version_item = nuevoItem.version
			session.add(nuevoAtributo)
			
			print '>>>estos es lo que hay después de hacer add FECHA'
			
				
			print nuevoAtributo.nombreAtributo
			print nuevoAtributo.valor
			print nuevoAtributo.item_id
			print nuevoAtributo.version_item
		
				
		print '>>>len(atributosNumerico)'
		print len(atributosNumerico)
		
		if len(atributosNumerico) > 0:		
			nuevoAtributo = ValoresNumerico()	
			for atributo in atributosNumerico:
				
				nuevoAtributo.nombreAtributo = atributo.nombreAtributo
				nuevoAtributo.valor = atributo.valor
				nuevoAtributo.item_id = nuevoItem.id
				nuevoAtributo.version_item = nuevoItem.version		
			session.add(nuevoAtributo)
			
			
			print '>>>estos es lo que hay después de hacer adD nuMERICO'
			
				
			print nuevoAtributo.nombreAtributo
			print nuevoAtributo.valor
			print nuevoAtributo.item_id
			print nuevoAtributo.version_item
			
		
		#retornamos
		response = Response()
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
		
	if dicParametros.get('operacion') == 'traerListaRevivir':
		itemsFase = session.query(Item).filter_by(fase_id=request.params['idFase'], flagUltimo = 1, flagBorrado = 1).all()
		
		print ">>>cantidad de item que vamos a enviar desde el contralador"
		print len(itemsFase)
		
		
		itemsJson = []
		for item in itemsFase:
			aux = {'nombreItem': item.nombre, 'idItem':item.id, 'codItem': item.codigo, 'complejidadItem': item.complejidad, 
			'descripcionItem':item.descripcion , 'nombreTipoItem':item.tipoItem.nombre, 'versionItem':item.version, 'idTipoItem': item.tipoItem.id,
			'estadoItem':item.estado}	
			itemsJson.append(aux)
		
		
		responseView = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		responseView.body = json.dumps(dict(success = True, items = itemsJson))
		responseView.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return responseView			
		
	if dicParametros.get('operacion') == 'revivir':	
		itemRevivir = session.query(Item).filter_by(id=request.params['idItemRevivir']).first()	

		itemRevivir.flagBorrado = 0
		
		responseView = Response()
		responseView.body = json.dumps(dict(success = True))
		responseView.content_type = 'application/json'
		return responseView
	
	if dicParametros.get('operacion') == 'impactoAtras':	
		#itemRevivir = session.query(Item).filter_by(id=request.params['idItemRevivir']).first()	

		#itemRevivir.flagBorrado = 0
		#items_visitados = {}
		#impacto = calcular_impacto(request.params['idItem'], items_visitados)
		
		#print '>>>este es el resultado del cálculo de impacto:' + str(impacto)
		
		
		
		responseView = Response()
		responseView.body = json.dumps(dict(success = True, nombreImagen = 'example2_graph.png'))
		responseView.content_type = 'application/json'
		return responseView	

'''def calcular_impacto(itemID, items_visitados):
	print "calcular_impacto:"
   
	#traemos todas las relaciones del item 
	relaciones = []
	
	antecesoresIDs = DBSession.query(RelacionA_S.antecesor).filter_by(sucesor = itemID).all()
	sucesoresIDs = DBSession.query(RelacionA_S.sucesor).filter_by(antecesor = itemID).all()
	
	hijosIDs = DBSession.query(RelacionP_H.hijo).filter_by(padre = itemID).all() 
	padresIDs = DBSession.query(RelacionP_H.padre).filter_by(hijo = itemID).all() 
	

	
	destinosIDs = antecesoresIDs + sucesoresIDs + hijosIDs + padresIDs

	print "relaciones:"
	#print relaciones

	item_recibido = DBSession.query(Item).filter_by(id = itemID).one()
	#datos_item_recibido = DBSession.query(Fase.nombre, Fase.orden).filter_by(id_fase=item_recibido.id_fase_fk).one()
	#items_visitados[item_recibido.id_item] = [datos_item_recibido[0],datos_item_recibido[1],
											   #item_recibido.cod_item + " "  + item_recibido.nombre, item_recibido.peso ]
	items_visitados[item_recibido.id] = [item_recibido.id]
			

	#suma_impacto = item_recibido.complejidad

	for destinoID in destinosIDs:
		
		item_destino = DBSession.query(Item).filter_by(id=destinoID).one()
		#datos_item_destino = DBSession.query(Fase.nombre, Fase.orden).filter_by(id_fase=item_destino.id_fase_fk).one()              
	   
		#print datos_item_destino
	   
		if items_visitados.has_key(item_destino.id) == False:
			suma_impacto = item_recibido.complejidad  + \
						   calcular_impacto(item_destino.id,items_visitados)
			
		
	#items_relaciones[iid] = relacionesOrigen 
		
		
	return suma_impacto'''
